home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Sound Cards
/
Programming Sound Cards.iso
/
sound_56
/
s3m_osci.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-01-01
|
5KB
|
181 lines
{$M 16000,0,1000}
program example_for_s3mplay;
uses S3MPlay,crt,blaster,dos;
const stereo_calc=true ;
_16bit_calc=false; { 16bit play not yet possible }
type Parray = ^TArray;
TArray = array[0..10000] of byte;
var samplerate:word;
Stereo:Boolean;
_16bit:Boolean;
filename:string;
{$L LINES.OBJ}
procedure linie(x1,y1,x2,y2:word;f:byte); external;
procedure init;
begin
if not load_S3M(filename) then halt;
writeln(' ''',songname,''' loaded ... (was saved with ST',savedunder:4:2,')');
if not Init_S3Mplayer then halt;
if not init_device(2) then begin writeln(' Blaster enviroment not found sorry ... ');halt end;
setsamplerate(samplerate,stereo);
set_ST3order(true);
loopS3M:=true;
end;
procedure bar(o,b,l:word); assembler;
asm
mov ax,0a000h
mov es,ax
mov di,[o]
mov bx,320
mov dx,[b]
add bx,dx
push bp
mov bp,[l]
cmp bp,0
je @@n
shl bp,1
mov ax,7
@@b:
mov cx,dx
rep stosb
sub di,bx
dec bp
jnz @@b
@@n:
pop bp
push bp
mov bp,[l]
neg bp
add bp,64
shl bp,1
mov ax,1
cmp bp,0
jz @@n2
@@b2:
mov cx,dx
rep stosb
sub di,bx
dec bp
jnz @@b2
@@n2:
pop bp
@@e:
end;
procedure waitretrace; assembler;
asm
{ waitraster : }
cli
mov dx,03dah
@@raster1:
in al,dx
and al,8
jz @@raster1
@@raster2:
in al,dx
and al,8
jnz @@raster2
sti
end;
var pos:word;
i:word;
h:Parray;
scr:array[0..319] of byte;
scr2:array[0..319] of byte;
b:byte;
yl,yr:integer;
drawseg:word;
begin
{ setup defaults: }
Samplerate:=45454;drawseg:=$a000;
Stereo:=stereo_calc;
_16bit:=_16bit_calc;
filename:=paramstr(1);
{ end of default ... }
textbackground(black);textcolor(lightgray);
clrscr;
writeln(' OSCI-S3M-PLAYER for SoundBlasters written by Cyder of Green Apple');
writeln(' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
writeln(' Version : ',version:3:2);
if (filename='') then halt;
writeln;
Init;
if not startplaying(stereo,_16bit,false) then halt;
writeln(#13#10' dmabuflength :',DMArealbufsize[1]);
writeln(#13#10' Stop playing and exit with <ESC> ');
writeln('press any key to switch to oscillator ... ');
readkey;
asm
mov ax,13h
int 10h
{ Fill the screen with blue (in standard palette) : }
mov ax,0a000h
mov es,ax
xor di,di
mov cx,32000
mov ax,0101h
rep stosw
end;
{ DIsplay Oscilator : }
if not stereo then
begin
h:=playbuffer;
while not keypressed do
begin
waitretrace;
for pos:=0 to usedchannels-1 do
bar(320*170+pos*15+10,10,channel[pos].sampleVol*ord(channel[pos].enabled));
yl:=h^[get_zaehler] shr 1;
for pos:=1 to 319 do
begin
i:=get_zaehler; { current position in DMAbuffer }
linie(pos-1,scr[pos-1],pos,scr[pos],1);
scr[pos-1]:=yl;yl:=h^[i] shr 1;
linie(pos-1,scr[pos-1],pos,yl,14);
end;
scr[319]:=yl;
end;
end
else { in stereo mode : }
begin
h:=playbuffer;
while not keypressed do
begin
for pos:=0 to usedchannels-1 do
bar(320*170+pos*15+10,10,channel[pos].sampleVol*ord(channel[pos].enabled));
i:=get_zaehler and $fffe;
yl:=h^[i] shr 2;yr:=h^[i+1] shr 2;
for pos:=1 to 319 do
begin
i:=get_zaehler and $fffe; { current position in DMAbuffer }
if i>dmarealbufsize[1] then b:=7 else b:=4;
{ left channel : }
linie(pos-1,36+scr[pos-1],pos,36+scr[pos],1);
scr[pos-1]:=yl;yl:=h^[i] shr 2;
linie(pos-1,36+scr[pos-1],pos,36+yl,14);
{ right channel : }
linie(pos-1,110+scr2[pos-1],pos,110+scr2[pos],1);
scr2[pos-1]:=yr;yr:=h^[i+1] shr 2;
linie(pos-1,110+scr2[pos-1],pos,110+yr,14);
end;
scr[319]:=yl;
scr2[319]:=yr;
end;
end;
asm
mov ax,3
int 10h
end;
stop_play;
done_module;
done_S3Mplayer;
end.